import java.util.*;
//二叉树非递归（迭代）后续遍历 力扣145
class Solution12 {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        Deque<TreeNode> stack = new ArrayDeque<>();
        TreeNode T = null; // 记录上一个出栈的节点

        while (root != null || !stack.isEmpty()) {
            // 1. 先不断深入左子树，并压入栈
            while (root != null) {
                stack.push(root);
                root = root.left;
            }

            // 2. 取出栈顶元素（但不出栈）
            TreeNode cur = stack.peek();

            // 3. 处理右子树或出栈
            if (cur.right == null || cur.right == T) {
                // 当前节点没有右子树 或者 右子树已经被访问过
                result.add(cur.val);
                T = stack.pop(); // 记录出栈的节点
            } else {
                // 右子树还没有访问过，继续访问右子树
                root = cur.right;
            }
        }
        return result;
    }
}